﻿using System.Windows.Controls;
using Microsoft.Extensions.DependencyInjection;
using RotovapPlatform.UI.ViewModels.MaterialManagement;
using System.Diagnostics;
using System.Threading.Tasks;
using System;

namespace RotovapPlatform.UI.Views.MaterialManagement
{
	/// <summary>
	/// StockInOutView.xaml 的交互逻辑
	/// </summary>
	public partial class StockInOutView : UserControl
	{
		private ShelfViewModel _shelfViewModel;
		private bool _isRefreshing = false;

		public StockInOutView()
		{
			InitializeComponent();

			// 获取StockInOutViewModel实例
			var viewModel = App.ServiceProvider.GetRequiredService<StockInOutViewModel>();

			// 设置DataContext
			DataContext = viewModel;

			// 设置ShelfView的DataContext
			_shelfViewModel = App.ServiceProvider.GetRequiredService<ShelfViewModel>();
			ShelfViewControl.DataContext = _shelfViewModel;

			// 订阅ShelfView的SelectedSlot变化事件
			_shelfViewModel.PropertyChanged += (sender, e) =>
			{
				if (e.PropertyName == nameof(ShelfViewModel.SelectedSlot) && _shelfViewModel.SelectedSlot != null)
				{
					// 当ShelfViewModel的SelectedSlot变化时，同步到StockInOutViewModel
					viewModel.SelectSlot(_shelfViewModel.SelectedSlot);
				}
			};

			// 订阅StockInOutViewModel的操作完成事件
			viewModel.OperationCompleted += async (sender, e) =>
			{
				// 防止重复刷新
				if (_isRefreshing)
				{
					Debug.WriteLine("StockInOutView: 已有刷新操作在进行中，跳过本次刷新");
					return;
				}

				try
				{
					_isRefreshing = true;
					Debug.WriteLine("StockInOutView: 收到操作完成事件，开始刷新ShelfView");

					// 使用Task.Delay给UI线程一些时间处理其他事件
					await Task.Delay(50);

					// 先刷新数据，确保数据库中的更改已经反映到内存
					await _shelfViewModel.RefreshDataAsync();

					// 使用ForceRefreshUI方法刷新所有货位，包括普通货位和特殊位置
					ShelfViewControl.ForceRefreshUI();

					Debug.WriteLine("StockInOutView: ShelfView刷新完成");
				}
				catch (Exception ex)
				{
					Debug.WriteLine($"StockInOutView: 刷新ShelfView时发生错误: {ex.Message}");
				}
				finally
				{
					_isRefreshing = false;
				}
			};

			// 订阅Loaded事件，确保在控件加载完成后刷新UI
			this.Loaded += async (s, e) =>
			{
				// 如果已经加载过数据，不再重复刷新
				if (_shelfViewModel.OccupiedSlots.Count > 0)
				{
					Debug.WriteLine("StockInOutView: 控件已加载，但数据已存在，跳过刷新");
					return;
				}

				Debug.WriteLine("StockInOutView: 控件已加载，开始刷新ShelfView");

				try
				{
					// 防止重复刷新
					if (_isRefreshing)
					{
						Debug.WriteLine("StockInOutView: 已有刷新操作在进行中，跳过本次刷新");
						return;
					}

					_isRefreshing = true;

					// 使用Task.Delay给UI线程一些时间处理其他事件
					await Task.Delay(50);

					// 刷新数据，确保数据库中的数据已经加载到内存
					await _shelfViewModel.RefreshDataAsync();

					// 强制刷新UI，确保数据显示在界面上
					ShelfViewControl.ForceRefreshUI();

					Debug.WriteLine("StockInOutView: 初始化刷新ShelfView完成");
				}
				catch (Exception ex)
				{
					Debug.WriteLine($"StockInOutView: 初始化刷新ShelfView时发生错误: {ex.Message}");
				}
				finally
				{
					_isRefreshing = false;
				}
			};
		}
	}
}